🎖️GitЯра🎖️
Node / meshtastic / Meshtastic-Android / files / core / domain / src / commonTest / kotlin / org / meshtastic / core / domain / usecase / settings / InstallProfileUseCaseTest.kt
Displaying Raw • Download
core/domain/src/commonTest/kotlin/org/meshtastic/core/domain/usecase/settings/InstallProfileUseCaseTest.kt bd2863243bab6eb213401d949839a2bc74dde7e2 (bd286324) Text, 17.14 KB
T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.core.domain.usecase.settings
Tff7b72import T7ee787kotlinx.coroutines.test.runTest
Tff7b72import T7ee787org.meshtastic.core.common.log.expectedConditionLabel
Tff7b72import T7ee787org.meshtastic.core.model.util.MalformedMeshtasticUrlException
Tff7b72import T7ee787org.meshtastic.core.model.util.getChannelUrl
Tff7b72import T7ee787org.meshtastic.core.repository.PacketQueueRejectedException
Tff7b72import T7ee787org.meshtastic.core.testing.FakeRadioConfigRepository
Tff7b72import T7ee787org.meshtastic.core.testing.FakeRadioController
Tff7b72import T7ee787org.meshtastic.core.testing.FakeRadioController.SettingsOperation
Tff7b72import T7ee787org.meshtastic.proto.Channel
Tff7b72import T7ee787org.meshtastic.proto.ChannelSet
Tff7b72import T7ee787org.meshtastic.proto.ChannelSettings
Tff7b72import T7ee787org.meshtastic.proto.Config
Tff7b72import T7ee787org.meshtastic.proto.Config.BluetoothConfig
Tff7b72import T7ee787org.meshtastic.proto.Config.DeviceConfig
Tff7b72import T7ee787org.meshtastic.proto.Config.DisplayConfig
Tff7b72import T7ee787org.meshtastic.proto.Config.LoRaConfig
Tff7b72import T7ee787org.meshtastic.proto.Config.NetworkConfig
Tff7b72import T7ee787org.meshtastic.proto.Config.PositionConfig
Tff7b72import T7ee787org.meshtastic.proto.Config.PowerConfig
Tff7b72import T7ee787org.meshtastic.proto.Config.SecurityConfig
Tff7b72import T7ee787org.meshtastic.proto.DeviceProfile
Tff7b72import T7ee787org.meshtastic.proto.ModuleConfig.AmbientLightingConfig
Tff7b72import T7ee787org.meshtastic.proto.ModuleConfig.AudioConfig
Tff7b72import T7ee787org.meshtastic.proto.ModuleConfig.CannedMessageConfig
Tff7b72import T7ee787org.meshtastic.proto.ModuleConfig.DetectionSensorConfig
Tff7b72import T7ee787org.meshtastic.proto.ModuleConfig.ExternalNotificationConfig
Tff7b72import T7ee787org.meshtastic.proto.ModuleConfig.MQTTConfig
Tff7b72import T7ee787org.meshtastic.proto.ModuleConfig.NeighborInfoConfig
Tff7b72import T7ee787org.meshtastic.proto.ModuleConfig.PaxcounterConfig
Tff7b72import T7ee787org.meshtastic.proto.ModuleConfig.RangeTestConfig
Tff7b72import T7ee787org.meshtastic.proto.ModuleConfig.RemoteHardwareConfig
Tff7b72import T7ee787org.meshtastic.proto.ModuleConfig.SerialConfig
Tff7b72import T7ee787org.meshtastic.proto.ModuleConfig.StatusMessageConfig
Tff7b72import T7ee787org.meshtastic.proto.ModuleConfig.StoreForwardConfig
Tff7b72import T7ee787org.meshtastic.proto.ModuleConfig.TAKConfig
Tff7b72import T7ee787org.meshtastic.proto.ModuleConfig.TelemetryConfig
Tff7b72import T7ee787org.meshtastic.proto.User
Tff7b72import T7ee787kotlin.test.BeforeTest
Tff7b72import T7ee787kotlin.test.Test
Tff7b72import T7ee787kotlin.test.assertEquals
Tff7b72import T7ee787kotlin.test.assertFailsWith
Tff7b72import T7ee787kotlin.test.assertFalse
Tff7b72import T7ee787kotlin.test.assertTrue
Tff7b72class T56d364InstallProfileUseCaseTest Tb4b4b4{
Tff7b72private Tff7b72lateinit Tff7b72var Te6edf3radioControllerTb4b4b4: Te6edf3FakeRadioController
Tff7b72private Tff7b72lateinit Tff7b72var Te6edf3radioConfigRepositoryTb4b4b4: Te6edf3FakeRadioConfigRepository
Tff7b72private Tff7b72lateinit Tff7b72var Te6edf3useCaseTb4b4b4: Te6edf3InstallProfileUseCase
Tf0883e@BeforeTest
Tff7b72fun Td2a8ffsetUpTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3radioController Tff7b72= Te6edf3FakeRadioControllerTb4b4b4(Tb4b4b4)
Te6edf3radioConfigRepository Tff7b72= Te6edf3FakeRadioConfigRepositoryTb4b4b4(Tb4b4b4)
Te6edf3useCase Tff7b72= Te6edf3InstallProfileUseCaseTb4b4b4(Te6edf3radioControllerTb4b4b4, Te6edf3radioConfigRepositoryTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`invoke calls begin and commit edit settings`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Te6edf3useCaseTb4b4b4(T79c0ff1T79c0ff2T79c0ff3T79c0ff4Tb4b4b4, Te6edf3DeviceProfileTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3UserTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3currentLoraConfig Tff7b72= Tff7b72nullTb4b4b4, Te6edf3isLocal Tff7b72= Tff7b72falseTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3radioControllerTb4b4b4.Te6edf3editSettingsCalledTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`invoke installs all sections of a full profile`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3profile Tff7b72=
Te6edf3DeviceProfileTb4b4b4(
Te6edf3long_name Tff7b72= Ta5d6ff"Ta5d6ffFull NodeTa5d6ff"Tb4b4b4,
Te6edf3short_name Tff7b72= Ta5d6ff"Ta5d6ffFULLTa5d6ff"Tb4b4b4,
Te6edf3config Tff7b72=
Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3LocalConfigTb4b4b4(
Te6edf3device Tff7b72= Te6edf3DeviceConfigTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3position Tff7b72= Te6edf3PositionConfigTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3power Tff7b72= Te6edf3PowerConfigTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3network Tff7b72= Te6edf3NetworkConfigTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3display Tff7b72= Te6edf3DisplayConfigTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3lora Tff7b72= Te6edf3LoRaConfigTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3bluetooth Tff7b72= Te6edf3BluetoothConfigTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3security Tff7b72= Te6edf3SecurityConfigTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3module_config Tff7b72=
Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3LocalModuleConfigTb4b4b4(
Te6edf3mqtt Tff7b72= Te6edf3MQTTConfigTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3serial Tff7b72= Te6edf3SerialConfigTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3external_notification Tff7b72= Te6edf3ExternalNotificationConfigTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3store_forward Tff7b72= Te6edf3StoreForwardConfigTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3range_test Tff7b72= Te6edf3RangeTestConfigTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3telemetry Tff7b72= Te6edf3TelemetryConfigTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3canned_message Tff7b72= Te6edf3CannedMessageConfigTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3audio Tff7b72= Te6edf3AudioConfigTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3remote_hardware Tff7b72= Te6edf3RemoteHardwareConfigTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3neighbor_info Tff7b72= Te6edf3NeighborInfoConfigTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3ambient_lighting Tff7b72= Te6edf3AmbientLightingConfigTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3detection_sensor Tff7b72= Te6edf3DetectionSensorConfigTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3paxcounter Tff7b72= Te6edf3PaxcounterConfigTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3statusmessage Tff7b72= Te6edf3StatusMessageConfigTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3tak Tff7b72= Te6edf3TAKConfigTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3fixed_position Tff7b72= Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3PositionTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3useCaseTb4b4b4(T79c0ff1T79c0ff2T79c0ff3T79c0ff4Tb4b4b4, Te6edf3profileTb4b4b4, Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3UserTb4b4b4(Te6edf3long_name Tff7b72= Ta5d6ff"Ta5d6ffOldTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3currentLoraConfig Tff7b72= Tff7b72nullTb4b4b4, Te6edf3isLocal Tff7b72= Tff7b72falseTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3radioControllerTb4b4b4.Te6edf3editSettingsCalledTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`fixed position queue rejection aborts profile installation after closing the edit transaction`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3rejection Tff7b72= Te6edf3PacketQueueRejectedExceptionTb4b4b4(Ta5d6ff"Ta5d6ffFixed positionTa5d6ff"Tb4b4b4)
Te6edf3radioControllerTb4b4b4.Te6edf3onSetFixedPosition Tff7b72= Tb4b4b4{ Te6edf3_Tb4b4b4, Te6edf3_ Tff7b72-Tff7b72> Tff7b72throw Te6edf3rejection Tb4b4b4}
Tff7b72val Te6edf3profile Tff7b72= Te6edf3DeviceProfileTb4b4b4(Te6edf3fixed_position Tff7b72= Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3PositionTb4b4b4(Te6edf3latitude_i Tff7b72= T79c0ff1Tb4b4b4, Te6edf3longitude_i Tff7b72= T79c0ff1Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3failure Tff7b72=
Te6edf3assertFailsWithTff7b72<Te6edf3PacketQueueRejectedExceptionTff7b72> Tb4b4b4{
Te6edf3useCaseTb4b4b4(
Te6edf3destNum Tff7b72= T79c0ff1T79c0ff2T79c0ff3T79c0ff4Tb4b4b4,
Te6edf3profile Tff7b72= Te6edf3profileTb4b4b4,
Te6edf3currentUser Tff7b72= Te6edf3UserTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3currentLoraConfig Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3isLocal Tff7b72= Tff7b72falseTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3assertEqualsTb4b4b4(Te6edf3rejectionTb4b4b4, Te6edf3failureTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffbeginTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcommitTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3radioControllerTb4b4b4.Te6edf3adminOperationsTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3radioControllerTb4b4b4.Te6edf3fixedPositionsTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`invoke installs is_unmessagable but never auto-installs is_licensed`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3profile Tff7b72= Te6edf3DeviceProfileTb4b4b4(Te6edf3is_unmessagable Tff7b72= Tff7b72trueTb4b4b4, Te6edf3is_licensed Tff7b72= Tff7b72trueTb4b4b4)
Te6edf3useCaseTb4b4b4(T79c0ff1T79c0ff2T79c0ff3T79c0ff4Tb4b4b4, Te6edf3profileTb4b4b4, Te6edf3UserTb4b4b4(Te6edf3long_name Tff7b72= Ta5d6ff"Ta5d6ffOldTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3currentLoraConfig Tff7b72= Tff7b72nullTb4b4b4, Te6edf3isLocal Tff7b72= Tff7b72falseTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Tff7b72trueTb4b4b4, Te6edf3radioControllerTb4b4b4.Te6edf3lastSetOwnerUserTff7b72?.Te6edf3is_unmessagableTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Tff7b72falseTb4b4b4, Te6edf3radioControllerTb4b4b4.Te6edf3lastSetOwnerUserTff7b72?.Te6edf3is_licensedTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`invoke normalizes channels refreshes local cache and writes URL LoRa once`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3primary Tff7b72= Te6edf3ChannelSettingsTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffNode A PrimaryTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3secondary Tff7b72= Te6edf3ChannelSettingsTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffNode A SecondaryTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3urlLoraConfig Tff7b72=
Te6edf3LoRaConfigTb4b4b4(
Te6edf3use_preset Tff7b72= Tff7b72trueTb4b4b4,
Te6edf3modem_preset Tff7b72= Te6edf3LoRaConfigTb4b4b4.Te6edf3ModemPresetTb4b4b4.Te6edf3MEDIUM_FASTTb4b4b4,
Te6edf3region Tff7b72= Te6edf3LoRaConfigTb4b4b4.Te6edf3RegionCodeTb4b4b4.Te6edf3USTb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3profileLoraConfig Tff7b72=
Te6edf3LoRaConfigTb4b4b4(
Te6edf3use_preset Tff7b72= Tff7b72trueTb4b4b4,
Te6edf3modem_preset Tff7b72= Te6edf3LoRaConfigTb4b4b4.Te6edf3ModemPresetTb4b4b4.Te6edf3LONG_SLOWTb4b4b4,
Te6edf3region Tff7b72= Te6edf3LoRaConfigTb4b4b4.Te6edf3RegionCodeTb4b4b4.Te6edf3EU_868Tb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3currentLoraConfig Tff7b72= Te6edf3LoRaConfigTb4b4b4(Te6edf3region Tff7b72= Te6edf3LoRaConfigTb4b4b4.Te6edf3RegionCodeTb4b4b4.Te6edf3ANZTb4b4b4)
Tff7b72val Te6edf3oldSettings Tff7b72= Te6edf3listOfTb4b4b4(Te6edf3ChannelSettingsTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffNode B PrimaryTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3cachedLoraConfig Tff7b72= Te6edf3LoRaConfigTb4b4b4(Te6edf3region Tff7b72= Te6edf3LoRaConfigTb4b4b4.Te6edf3RegionCodeTb4b4b4.Te6edf3EU_433Tb4b4b4)
Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3setChannelSetTb4b4b4(Te6edf3ChannelSetTb4b4b4(Te6edf3settings Tff7b72= Te6edf3oldSettingsTb4b4b4, Te6edf3lora_config Tff7b72= Te6edf3cachedLoraConfigTb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3exportedProfile Tff7b72=
Te6edf3DeviceProfileTb4b4b4(
Te6edf3config Tff7b72= Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3LocalConfigTb4b4b4(Te6edf3lora Tff7b72= Te6edf3profileLoraConfigTb4b4b4)Tb4b4b4,
Te6edf3channel_url Tff7b72=
Te6edf3ChannelSetTb4b4b4(
Te6edf3settings Tff7b72= Te6edf3listOfTb4b4b4(Te6edf3primaryTb4b4b4, Te6edf3ChannelSettingsTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3primaryTb4b4b4, Te6edf3secondaryTb4b4b4)Tb4b4b4,
Te6edf3lora_config Tff7b72= Te6edf3urlLoraConfigTb4b4b4,
Tb4b4b4)
Tb4b4b4.Te6edf3getChannelUrlTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3useCaseTb4b4b4(
T79c0ff4T79c0ff3T79c0ff2T79c0ff1Tb4b4b4,
Te6edf3exportedProfileTb4b4b4,
Te6edf3UserTb4b4b4(Te6edf3long_name Tff7b72= Ta5d6ff"Ta5d6ffNode BTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3currentLoraConfig Tff7b72= Te6edf3currentLoraConfigTb4b4b4,
Te6edf3isLocal Tff7b72= Tff7b72trueTb4b4b4,
Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3radioControllerTb4b4b4.Te6edf3editSettingsCalledTb4b4b4, Ta5d6ff"Ta5d6ffprofile install transaction did not runTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3channelWrites Tff7b72= Te6edf3radioControllerTb4b4b4.Te6edf3channelWrites
Te6edf3assertEqualsTb4b4b4(Te6edf3ListTb4b4b4(T79c0ff8Tb4b4b4) Tb4b4b4{ T79c0ff4T79c0ff3T79c0ff2T79c0ff1 Tb4b4b4}Tb4b4b4, Te6edf3channelWritesTb4b4b4.Te6edf3mapTb4b4b4(Te6edf3FakeRadioControllerTb4b4b4.Te6edf3ChannelWriteTff7b72::Te6edf3destinationTb4b4b4)Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Tb4b4b4(T79c0ff0.Tb4b4b4.T79c0ff7Tb4b4b4)Tb4b4b4.Te6edf3toListTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3channelWritesTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3channelTb4b4b4.Te6edf3index Tb4b4b4}Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(
Te6edf3listOfTb4b4b4(
Te6edf3ChannelTb4b4b4.Te6edf3RoleTb4b4b4.Te6edf3PRIMARYTb4b4b4,
Te6edf3ChannelTb4b4b4.Te6edf3RoleTb4b4b4.Te6edf3SECONDARYTb4b4b4,
Te6edf3ChannelTb4b4b4.Te6edf3RoleTb4b4b4.Te6edf3DISABLEDTb4b4b4,
Te6edf3ChannelTb4b4b4.Te6edf3RoleTb4b4b4.Te6edf3DISABLEDTb4b4b4,
Te6edf3ChannelTb4b4b4.Te6edf3RoleTb4b4b4.Te6edf3DISABLEDTb4b4b4,
Te6edf3ChannelTb4b4b4.Te6edf3RoleTb4b4b4.Te6edf3DISABLEDTb4b4b4,
Te6edf3ChannelTb4b4b4.Te6edf3RoleTb4b4b4.Te6edf3DISABLEDTb4b4b4,
Te6edf3ChannelTb4b4b4.Te6edf3RoleTb4b4b4.Te6edf3DISABLEDTb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3channelWritesTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3channelTb4b4b4.Te6edf3role Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3listOfTb4b4b4(Te6edf3primaryTb4b4b4, Te6edf3secondaryTb4b4b4)Tb4b4b4, Te6edf3channelWritesTb4b4b4.Te6edf3takeTb4b4b4(T79c0ff2Tb4b4b4)Tb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3channelTb4b4b4.Te6edf3settings Tb4b4b4}Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3listOfTb4b4b4(Te6edf3primaryTb4b4b4, Te6edf3secondaryTb4b4b4)Tb4b4b4, Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3currentChannelSetTb4b4b4.Te6edf3settingsTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3urlLoraConfigTb4b4b4, Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3currentChannelSetTb4b4b4.Te6edf3lora_configTb4b4b4)
Te6edf3assertEqualsTb4b4b4(
Te6edf3listOfTb4b4b4(Te6edf3FakeRadioControllerTb4b4b4.Te6edf3ConfigWriteTb4b4b4(Te6edf3destination Tff7b72= T79c0ff4T79c0ff3T79c0ff2T79c0ff1Tb4b4b4, Te6edf3config Tff7b72= Te6edf3ConfigTb4b4b4(Te6edf3lora Tff7b72= Te6edf3urlLoraConfigTb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3radioControllerTb4b4b4.Te6edf3configWritesTb4b4b4,
Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(
Te6edf3channelWritesTb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3SettingsOperationTb4b4b4.Te6edf3SetChannelTb4b4b4(Tffa657itTb4b4b4.Te6edf3channelTb4b4b4) Tb4b4b4} Tff7b72+
Te6edf3SettingsOperationTb4b4b4.Te6edf3SetConfigTb4b4b4(Te6edf3ConfigTb4b4b4(Te6edf3lora Tff7b72= Te6edf3urlLoraConfigTb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3radioControllerTb4b4b4.Te6edf3settingsOperationsTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`invoke treats blank channel URL as absent and installs profile LoRa once`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3oldSettings Tff7b72= Te6edf3listOfTb4b4b4(Te6edf3ChannelSettingsTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffKeep MeTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3currentLoraConfig Tff7b72= Te6edf3LoRaConfigTb4b4b4(Te6edf3region Tff7b72= Te6edf3LoRaConfigTb4b4b4.Te6edf3RegionCodeTb4b4b4.Te6edf3EU_868Tb4b4b4)
Tff7b72val Te6edf3profileLoraConfig Tff7b72= Te6edf3LoRaConfigTb4b4b4(Te6edf3region Tff7b72= Te6edf3LoRaConfigTb4b4b4.Te6edf3RegionCodeTb4b4b4.Te6edf3USTb4b4b4)
Tff7b72val Te6edf3cachedLoraConfig Tff7b72= Te6edf3LoRaConfigTb4b4b4(Te6edf3region Tff7b72= Te6edf3LoRaConfigTb4b4b4.Te6edf3RegionCodeTb4b4b4.Te6edf3ANZTb4b4b4)
Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3setChannelSetTb4b4b4(Te6edf3ChannelSetTb4b4b4(Te6edf3settings Tff7b72= Te6edf3oldSettingsTb4b4b4, Te6edf3lora_config Tff7b72= Te6edf3cachedLoraConfigTb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3profile Tff7b72=
Te6edf3DeviceProfileTb4b4b4(Te6edf3channel_url Tff7b72= Ta5d6ff"Ta5d6ff Ta5d6ff\Ta5d6fftTa5d6ff\Ta5d6ffnTa5d6ff"Tb4b4b4, Te6edf3config Tff7b72= Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3LocalConfigTb4b4b4(Te6edf3lora Tff7b72= Te6edf3profileLoraConfigTb4b4b4)Tb4b4b4)
Te6edf3useCaseTb4b4b4(T79c0ff4T79c0ff3T79c0ff2T79c0ff1Tb4b4b4, Te6edf3profileTb4b4b4, Te6edf3UserTb4b4b4(Te6edf3long_name Tff7b72= Ta5d6ff"Ta5d6ffNode BTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3currentLoraConfig Tff7b72= Te6edf3currentLoraConfigTb4b4b4, Te6edf3isLocal Tff7b72= Tff7b72trueTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3radioControllerTb4b4b4.Te6edf3editSettingsCalledTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3radioControllerTb4b4b4.Te6edf3localChannelsTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(
Te6edf3listOfTb4b4b4(Te6edf3FakeRadioControllerTb4b4b4.Te6edf3ConfigWriteTb4b4b4(Te6edf3destination Tff7b72= T79c0ff4T79c0ff3T79c0ff2T79c0ff1Tb4b4b4, Te6edf3config Tff7b72= Te6edf3ConfigTb4b4b4(Te6edf3lora Tff7b72= Te6edf3profileLoraConfigTb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3radioControllerTb4b4b4.Te6edf3configWritesTb4b4b4,
Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(
Te6edf3listOfTb4b4b4(Te6edf3FakeRadioConfigRepositoryTb4b4b4.Te6edf3ChannelSetUpdateTb4b4b4(Te6edf3settingsList Tff7b72= Tff7b72nullTb4b4b4, Te6edf3loraConfig Tff7b72= Te6edf3profileLoraConfigTb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3channelSetUpdatesTb4b4b4,
Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3oldSettingsTb4b4b4, Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3currentChannelSetTb4b4b4.Te6edf3settingsTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3profileLoraConfigTb4b4b4, Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3currentChannelSetTb4b4b4.Te6edf3lora_configTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`invoke replaces local channels and preserves cached LoRa when no LoRa write is needed`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3cachedLoraConfig Tff7b72= Te6edf3LoRaConfigTb4b4b4(Te6edf3region Tff7b72= Te6edf3LoRaConfigTb4b4b4.Te6edf3RegionCodeTb4b4b4.Te6edf3ANZTb4b4b4)
Tff7b72val Te6edf3importedPrimary Tff7b72= Te6edf3ChannelSettingsTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffImported PrimaryTa5d6ff"Tb4b4b4)
Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3setChannelSetTb4b4b4(
Te6edf3ChannelSetTb4b4b4(Te6edf3settings Tff7b72= Te6edf3listOfTb4b4b4(Te6edf3ChannelSettingsTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffOld PrimaryTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4, Te6edf3lora_config Tff7b72= Te6edf3cachedLoraConfigTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3profile Tff7b72=
Te6edf3DeviceProfileTb4b4b4(Te6edf3channel_url Tff7b72= Te6edf3ChannelSetTb4b4b4(Te6edf3settings Tff7b72= Te6edf3listOfTb4b4b4(Te6edf3importedPrimaryTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3getChannelUrlTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3useCaseTb4b4b4(T79c0ff4T79c0ff3T79c0ff2T79c0ff1Tb4b4b4, Te6edf3profileTb4b4b4, Te6edf3UserTb4b4b4(Te6edf3long_name Tff7b72= Ta5d6ff"Ta5d6ffNode BTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3currentLoraConfig Tff7b72= Te6edf3cachedLoraConfigTb4b4b4, Te6edf3isLocal Tff7b72= Tff7b72trueTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3radioControllerTb4b4b4.Te6edf3localConfigsTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3listOfTb4b4b4(Te6edf3importedPrimaryTb4b4b4)Tb4b4b4, Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3currentChannelSetTb4b4b4.Te6edf3settingsTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3cachedLoraConfigTb4b4b4, Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3currentChannelSetTb4b4b4.Te6edf3lora_configTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`invoke skips redundant LoRa write when desired config is already active`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3currentLoraConfig Tff7b72= Te6edf3LoRaConfigTb4b4b4(Te6edf3region Tff7b72= Te6edf3LoRaConfigTb4b4b4.Te6edf3RegionCodeTb4b4b4.Te6edf3USTb4b4b4)
Tff7b72val Te6edf3profile Tff7b72= Te6edf3DeviceProfileTb4b4b4(Te6edf3config Tff7b72= Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3LocalConfigTb4b4b4(Te6edf3lora Tff7b72= Te6edf3currentLoraConfigTb4b4b4)Tb4b4b4)
Te6edf3useCaseTb4b4b4(T79c0ff4T79c0ff3T79c0ff2T79c0ff1Tb4b4b4, Te6edf3profileTb4b4b4, Te6edf3UserTb4b4b4(Te6edf3long_name Tff7b72= Ta5d6ff"Ta5d6ffNode BTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3currentLoraConfig Tff7b72= Te6edf3currentLoraConfigTb4b4b4, Te6edf3isLocal Tff7b72= Tff7b72falseTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3radioControllerTb4b4b4.Te6edf3localConfigsTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`invoke does not replace local cache for a remote profile install`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3oldSettings Tff7b72= Te6edf3listOfTb4b4b4(Te6edf3ChannelSettingsTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffLocal PrimaryTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3remotePrimary Tff7b72= Te6edf3ChannelSettingsTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffRemote PrimaryTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3cachedChannelSet Tff7b72=
Te6edf3ChannelSetTb4b4b4(Te6edf3settings Tff7b72= Te6edf3oldSettingsTb4b4b4, Te6edf3lora_config Tff7b72= Te6edf3LoRaConfigTb4b4b4(Te6edf3region Tff7b72= Te6edf3LoRaConfigTb4b4b4.Te6edf3RegionCodeTb4b4b4.Te6edf3ANZTb4b4b4)Tb4b4b4)
Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3setChannelSetTb4b4b4(Te6edf3cachedChannelSetTb4b4b4)
Tff7b72val Te6edf3profile Tff7b72=
Te6edf3DeviceProfileTb4b4b4(
Te6edf3channel_url Tff7b72=
Te6edf3ChannelSetTb4b4b4(
Te6edf3settings Tff7b72= Te6edf3listOfTb4b4b4(Te6edf3remotePrimaryTb4b4b4)Tb4b4b4,
Te6edf3lora_config Tff7b72= Te6edf3LoRaConfigTb4b4b4(Te6edf3region Tff7b72= Te6edf3LoRaConfigTb4b4b4.Te6edf3RegionCodeTb4b4b4.Te6edf3USTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4.Te6edf3getChannelUrlTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3useCaseTb4b4b4(T79c0ff4T79c0ff3T79c0ff2T79c0ff1Tb4b4b4, Te6edf3profileTb4b4b4, Te6edf3UserTb4b4b4(Te6edf3long_name Tff7b72= Ta5d6ff"Ta5d6ffRemoteTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3currentLoraConfig Tff7b72= Tff7b72nullTb4b4b4, Te6edf3isLocal Tff7b72= Tff7b72falseTb4b4b4)
Te6edf3assertEqualsTb4b4b4(
Te6edf3FakeRadioControllerTb4b4b4.Te6edf3ChannelWriteTb4b4b4(
T79c0ff4T79c0ff3T79c0ff2T79c0ff1Tb4b4b4,
Te6edf3ChannelTb4b4b4(Te6edf3index Tff7b72= T79c0ff0Tb4b4b4, Te6edf3role Tff7b72= Te6edf3ChannelTb4b4b4.Te6edf3RoleTb4b4b4.Te6edf3PRIMARYTb4b4b4, Te6edf3settings Tff7b72= Te6edf3remotePrimaryTb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3radioControllerTb4b4b4.Te6edf3channelWritesTb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3radioControllerTb4b4b4.Te6edf3localChannelsTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3cachedChannelSetTb4b4b4, Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3currentChannelSetTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`invoke leaves local cache unchanged when a channel write fails`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3oldSettings Tff7b72= Te6edf3listOfTb4b4b4(Te6edf3ChannelSettingsTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffLocal PrimaryTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3cachedChannelSet Tff7b72=
Te6edf3ChannelSetTb4b4b4(Te6edf3settings Tff7b72= Te6edf3oldSettingsTb4b4b4, Te6edf3lora_config Tff7b72= Te6edf3LoRaConfigTb4b4b4(Te6edf3region Tff7b72= Te6edf3LoRaConfigTb4b4b4.Te6edf3RegionCodeTb4b4b4.Te6edf3ANZTb4b4b4)Tb4b4b4)
Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3setChannelSetTb4b4b4(Te6edf3cachedChannelSetTb4b4b4)
Te6edf3radioControllerTb4b4b4.Te6edf3failChannelWriteAfter Tff7b72= T79c0ff2
Tff7b72val Te6edf3profile Tff7b72=
Te6edf3DeviceProfileTb4b4b4(
Te6edf3channel_url Tff7b72=
Te6edf3ChannelSetTb4b4b4(
Te6edf3settings Tff7b72= Te6edf3listOfTb4b4b4(Te6edf3ChannelSettingsTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffImported PrimaryTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3lora_config Tff7b72= Te6edf3LoRaConfigTb4b4b4(Te6edf3region Tff7b72= Te6edf3LoRaConfigTb4b4b4.Te6edf3RegionCodeTb4b4b4.Te6edf3USTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4.Te6edf3getChannelUrlTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3assertFailsWithTff7b72<Te6edf3IllegalStateExceptionTff7b72> Tb4b4b4{
Te6edf3useCaseTb4b4b4(T79c0ff4T79c0ff3T79c0ff2T79c0ff1Tb4b4b4, Te6edf3profileTb4b4b4, Te6edf3UserTb4b4b4(Te6edf3long_name Tff7b72= Ta5d6ff"Ta5d6ffLocalTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3currentLoraConfig Tff7b72= Tff7b72nullTb4b4b4, Te6edf3isLocal Tff7b72= Tff7b72trueTb4b4b4)
Tb4b4b4}
Te6edf3assertEqualsTb4b4b4(Te6edf3cachedChannelSetTb4b4b4, Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3currentChannelSetTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`invoke rejects an empty channel set before opening the transaction`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3destinationPrimary Tff7b72=
Te6edf3ChannelTb4b4b4(Te6edf3role Tff7b72= Te6edf3ChannelTb4b4b4.Te6edf3RoleTb4b4b4.Te6edf3PRIMARYTb4b4b4, Te6edf3index Tff7b72= T79c0ff0Tb4b4b4, Te6edf3settings Tff7b72= Te6edf3ChannelSettingsTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffNode B PrimaryTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3radioControllerTb4b4b4.Te6edf3channelWritesTb4b4b4.Te6edf3addTb4b4b4(
Te6edf3FakeRadioControllerTb4b4b4.Te6edf3ChannelWriteTb4b4b4(Te6edf3destination Tff7b72= Tff7b72nullTb4b4b4, Te6edf3channel Tff7b72= Te6edf3destinationPrimaryTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3profile Tff7b72=
Te6edf3DeviceProfileTb4b4b4(
Te6edf3long_name Tff7b72= Ta5d6ff"Ta5d6ffMust Not ApplyTa5d6ff"Tb4b4b4,
Te6edf3channel_url Tff7b72=
Te6edf3ChannelSetTb4b4b4(
Te6edf3settings Tff7b72= Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3lora_config Tff7b72= Te6edf3LoRaConfigTb4b4b4(Te6edf3use_preset Tff7b72= Tff7b72trueTb4b4b4, Te6edf3region Tff7b72= Te6edf3LoRaConfigTb4b4b4.Te6edf3RegionCodeTb4b4b4.Te6edf3USTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4.Te6edf3getChannelUrlTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3assertFailsWithTff7b72<Te6edf3MalformedMeshtasticUrlExceptionTff7b72> Tb4b4b4{
Te6edf3useCaseTb4b4b4(T79c0ff4T79c0ff3T79c0ff2T79c0ff1Tb4b4b4, Te6edf3profileTb4b4b4, Te6edf3UserTb4b4b4(Te6edf3long_name Tff7b72= Ta5d6ff"Ta5d6ffNode BTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3currentLoraConfig Tff7b72= Tff7b72nullTb4b4b4, Te6edf3isLocal Tff7b72= Tff7b72trueTb4b4b4)
Tb4b4b4}
Te6edf3assertFalseTb4b4b4(Te6edf3radioControllerTb4b4b4.Te6edf3editSettingsCalledTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3listOfTb4b4b4(Te6edf3destinationPrimaryTb4b4b4)Tb4b4b4, Te6edf3radioControllerTb4b4b4.Te6edf3localChannelsTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3radioControllerTb4b4b4.Te6edf3localConfigsTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3radioControllerTb4b4b4.Te6edf3settingsOperationsTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`invoke rejects a malformed channel URL before opening the transaction`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3profile Tff7b72= Te6edf3DeviceProfileTb4b4b4(Te6edf3long_name Tff7b72= Ta5d6ff"Ta5d6ffMust Not ApplyTa5d6ff"Tb4b4b4, Te6edf3channel_url Tff7b72= Ta5d6ff"Ta5d6ffhttps://example.com/not-a-channelTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3error Tff7b72=
Te6edf3assertFailsWithTff7b72<Te6edf3MalformedMeshtasticUrlExceptionTff7b72> Tb4b4b4{
Te6edf3useCaseTb4b4b4(T79c0ff4T79c0ff3T79c0ff2T79c0ff1Tb4b4b4, Te6edf3profileTb4b4b4, Te6edf3UserTb4b4b4(Te6edf3long_name Tff7b72= Ta5d6ff"Ta5d6ffNode BTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3currentLoraConfig Tff7b72= Tff7b72nullTb4b4b4, Te6edf3isLocal Tff7b72= Tff7b72trueTb4b4b4)
Tb4b4b4}
Te6edf3assertFalseTb4b4b4(Te6edf3radioControllerTb4b4b4.Te6edf3editSettingsCalledTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3radioControllerTb4b4b4.Te6edf3localChannelsTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3radioControllerTb4b4b4.Te6edf3localConfigsTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Ta5d6ff"Ta5d6ffmalformed-meshtastic-urlTa5d6ff"Tb4b4b4, Te6edf3errorTb4b4b4.Te6edf3expectedConditionLabelTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Served by rngit 1.5.1 - Generated in 0.11s